/**
 * 用户认证相关工具函数
 * 提供登录状态管理、用户信息存储等功能
 */

import { USER_API } from '../config/api.js'

// 存储键名常量
const STORAGE_KEYS = {
  USER_INFO: 'userInfo',
  LOGIN_STATUS: 'isLoggedIn',
  TOKEN: 'token'
}

/**
 * 检查用户是否已登录
 * @returns {boolean} 登录状态
 */
export function isLoggedIn() {
  try {
    const loginStatus = uni.getStorageSync(STORAGE_KEYS.LOGIN_STATUS)
    const userInfo = uni.getStorageSync(STORAGE_KEYS.USER_INFO)
    const token = uni.getStorageSync(STORAGE_KEYS.TOKEN)
    
    // 如果有登录状态标记、用户信息和token，则认为已登录
    return !!(loginStatus && userInfo && token)
  } catch (error) {
    console.error('检查登录状态失败:', error)
    return false
  }
}

/**
 * 获取当前用户信息
 * @returns {object|null} 用户信息对象或null
 */
export function getCurrentUser() {
  try {
    const userInfo = uni.getStorageSync(STORAGE_KEYS.USER_INFO);
    if (userInfo) {
      return typeof userInfo === 'string' ? JSON.parse(userInfo) : userInfo
    }
    return null
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return null
  }
}

/**
 * 设置用户登录信息
 * @param {string} token 登录token
 * @param {object} userInfo 用户信息
 */
export function setUserLogin(token, userInfo) {
  try {
    // 标准化用户信息
    const normalizedUserInfo = normalizeUserInfo(userInfo)
    
    // 保存到本地存储
    uni.setStorageSync(STORAGE_KEYS.TOKEN, token)
    uni.setStorageSync(STORAGE_KEYS.USER_INFO, JSON.stringify(normalizedUserInfo))
    uni.setStorageSync(STORAGE_KEYS.LOGIN_STATUS, true)
    
    console.log('用户登录信息已保存:', {
      token: token ? '***' : null,
      userInfo: normalizedUserInfo
    })
  } catch (error) {
    console.error('保存登录信息失败:', error)
  }
}

/**
 * 清除用户登录信息（退出登录）
 */
export function clearUserLogin() {
  try {
    uni.removeStorageSync(STORAGE_KEYS.USER_INFO)
    uni.removeStorageSync(STORAGE_KEYS.TOKEN)
    uni.removeStorageSync(STORAGE_KEYS.LOGIN_STATUS)
    
    console.log('用户登录信息已清除')
  } catch (error) {
    console.error('清除登录信息失败:', error)
  }
}

/**
 * 获取登录token
 * @returns {string|null} token或null
 */
export function getToken() {
  try {
    return uni.getStorageSync(STORAGE_KEYS.TOKEN) || null
  } catch (error) {
    console.error('获取token失败:', error)
    return null
  }
}

/**
 * 跳转到登录页面
 * @param {string} redirectUrl 登录成功后的重定向地址
 */
export function navigateToLogin(redirectUrl = '') {
  const url = redirectUrl ? `/pages/login/login?redirect=${encodeURIComponent(redirectUrl)}` : '/pages/login/login'
  
  uni.navigateTo({
    url: url,
    fail: (error) => {
      console.error('跳转登录页面失败:', error)
      uni.showToast({
        title: '跳转失败',
        icon: 'none'
      })
    }
  })
}

/**
 * 检查登录状态，如果未登录则跳转到登录页
 * @param {string} redirectUrl 登录成功后的重定向地址
 * @returns {boolean} 是否已登录
 */
export function requireLogin(redirectUrl = '') {
  if (!isLoggedIn()) {
    navigateToLogin(redirectUrl)
    return false
  }
  return true
}

/**
 * 获取完整的用户信息
 */
export async function fetchUserInfo() {
  try {
    const token = getToken()
    if (!token) {
      throw new Error('未找到登录token')
    }

    const response = await uni.request({
      url: USER_API.USER_INFO,
      method: 'GET',
      header: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
      }
    })

    if (response.statusCode === 200 && response.data.code === 200) {
      const userInfo = response.data.data
      
      // 更新本地存储的用户信息
      const normalizedUserInfo = normalizeUserInfo(userInfo)
      uni.setStorageSync(STORAGE_KEYS.USER_INFO, JSON.stringify(normalizedUserInfo))
      
      console.log('用户信息更新成功:', normalizedUserInfo)
      return normalizedUserInfo
    } else {
      throw new Error(response.data?.data?.error_message || response.data?.error_message || response.data?.message || '获取用户信息失败')
    }
  } catch (error) {
    console.error('获取用户信息失败:', error)
    throw error
  }
}

/**
 * 标准化用户信息格式
 * @param {object} userInfo 原始用户信息
 * @returns {object} 标准化后的用户信息
 */
export function normalizeUserInfo(userInfo) {
  if (!userInfo) return getDefaultUserInfo()
  
  return {
    nickname: userInfo.nickname || '用户',
    userid: userInfo.userid || '',
    signature: userInfo.signature || '这个人很懒，什么都没留下',
    pkg_credit: userInfo.pkg_credit || 0,
    friend_count: userInfo.friend_count || 0,
    avatar: userInfo.avatar || '/static/profile/avatar.jpg',
    // 保留其他可能的字段
    ...userInfo
  }
}

/**
 * 获取默认用户信息
 * @returns {object} 默认用户信息
 */
export function getDefaultUserInfo() {
  return {
    nickname: '点击头像登录',
    userid: '',
    signature: '登录后查看个人信息',
    pkg_credit: 0,
    friend_count: 0,
    avatar: '/static/profile/avatar.jpg'
  }
}
